forceStopPackage 的副作用
更新日期:
ActivityManager 有个一个函数 forceStopPackage:
|
|
函数具体的实现流程在 ActivityManagerService 中,具体实现这里不分析(后面可以分析一下)。这个函数用于强制终止指定的 package,包括这个 package 所在的进程,包括的 Service。并且终止 Service 不会被当作 crash 而被系统重新启动起来。就是俗称杀得干净,不像某些 xx 助手的一键清理,那些一键清理调用的是 killBackgroundProcesses(String packageName) 。这个函数虽然能杀死一些后台进程,但是其所属的 Service 会由于异常终止,会被系统重新启动起来。所以那些 xx 助手的清理功能基本上是没用的。
这个函数虽然猛,但是对调用者有严格限制,不仅要求调用者的进程具有系统权限(在 /system/app 下),而且必需具有系统签名(用编译系统 rom 的签名进行编译)。否则调用报权限异常。所以第三方应用想通过反射、root 之类调用的就省省吧,目前官方系统只有系统的 Setting 里面的强制终止应用会调用这个函数。
不过我工作上定制 rom,弄了个帐号切换的功能,然后切换不同帐号要清理下当前的任务,我于是就调用这个函数来清理。清理倒是清理得很干净,但是最近发现一个问题:这个函数强制终止应用,还会把应用设置了的 alarm 给清理掉。这点要特别注意,怪不得在 Setting 里面强制终止应用的时候,会弹一个提示框告诉你可能会出现应用异常。这还真异常了。简单的贴下代码:
在 ActivityManagerService 里面:
|
|
这里会发一个 ACTION_PACKAGE_RESTARTED
的广播,在 AlarmManagerService 里面会接收这个广播,判断这个广播的 package name 如果在设置过了的 alarm list 中,就会把对应的 alarm 给删掉(AlarmManagerSerivce 用了几个 ArrayList 来保存不同 type 的 alarm)。
|
|
其中最后那里那个 removeLocked(String packageName) 就是去删除广播中发的包设置过的 alarm(具体代码这里不贴了,可以去查看 AlarmManagerService)。
这里记录这篇文章就是提醒下,调用这个函数会有这个“副作用”,免得下次应用的 alarm 没反应,啥头绪都没用。